ci(publish): don't strand the GitHub release on transient registry failure#35
Conversation
…failure Both registry publishes now use `continue-on-error: true` and the "Create GitHub release" step runs as long as at least one registry accepted the publish. A new "Registry publish status" step at the end re-asserts the job-level failure when either publish errored, so partial-success runs are still visible in the run UI / branch protection / notifications. Motivation: v1.0.2's publish workflow failed at "Publish to Open VSX" with an HTTP 405 (transient registry-side; v1.0.1 shipped unchanged 14 h earlier). Because the publish step is a `run:` script with `bash -e`, the job aborted there and "Create GitHub release" never ran — so v1.0.2 made it to the VS Code Marketplace but was missing from both Open VSX and GitHub Releases. The recovery cost a fresh 1.0.x tag (v1.0.3). Behaviour matrix after this change: vsce | ovsx | GH release | job -----|------|------------|----- ✓ | ✓ | created | green (unchanged) ✓ | ✗ | created | red (was: not created, red) ✗ | ✓ | created | red (was: not created, red) ✗ | ✗ | skipped | red (unchanged) The status step gates itself on `steps.<publish>.conclusion == 'success'` so it stays quiet when the job fails upstream of publish (lint, tests, audit, etc.) — `conclusion` is the post-`continue-on-error` roll-up, which is 'success' for any publish step that actually executed and 'skipped' for steps that never reached execution. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
Warning Rate limit exceeded
You’ve run out of usage credits. Purchase more in the billing tab. ⌛ How to resolve this issue?After the wait time has elapsed, a review can be triggered using the We recommend that you space out your commits to avoid hitting the rate limit. 🚦 How do rate limits work?CodeRabbit enforces hourly rate limits for each developer per organization. Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout. Please see our FAQ for further information. ℹ️ Review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (1)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Summary
Publish to VS Code MarketplaceandPublish to Open VSXnow run withcontinue-on-error: true.Create GitHub releaseruns as long as at least one registry accepted the publish (so the .vsix + SBOM still land somewhere a user can grab them).Registry publish statusstep re-asserts the job-level failure when either publish errored — so partial-success runs are still red in the run UI, in branch protection, and in any notification wiring.Why
v1.0.2's publish run (26152644715) failed at
Publish to Open VSXwith an HTTP 405 — a transient Open VSX server-side hiccup (v1.0.1 shipped unchanged 14 h earlier through the same code path). Because the publish step is arun:script underbash -e, the job aborted at that line andCreate GitHub releasenever ran. Net state for v1.0.2 was: ✓ VS Code Marketplace, ✗ Open VSX, ✗ GitHub Release. Recovery cost a fresh 1.0.x tag (v1.0.3 via PR #34).After this change, that same incident would have left
v1.0.2on Marketplace and on GitHub Releases, with only the Open VSX gap to chase — no need to burn a new tag to recover the GH release.Behaviour matrix
Rows 2 and 3 are the changed behaviour. Rows 1 and 4 are unchanged.
Why
conclusionnotoutcomein the status gateThe status step uses
steps.<publish>.conclusion == 'success'to decide whether to run, butsteps.<publish>.outcometo decide whether to fail. That's deliberate:outcomeis the raw step result (the actual exit-code success/failure).conclusionis the post-continue-on-errorroll-up (always'success'for any continue-on-error step that ran,'skipped'for steps that didn't reach execution).So:
conclusion == 'success'filters out runs where lint/tests/audit failed upstream of publish — the status step stays quiet on those.outcome != 'success'correctly catches a real registry failure even thoughcontinue-on-errormasked it from the job-level result.Test plan
python -c \"import yaml; yaml.safe_load(open('.github/workflows/publish.yml'))\").steps.<id>.outcomevs.conclusion.OVSX_PATat a deliberately-bad endpoint.Out of scope
workflow_dispatchwithtag:input, and with this PR a manual re-dispatch on the same tag is safer (a duplicate Marketplace publish would nowcontinue-on-errorrather than abort the job).🤖 Generated with Claude Code